//============================================================================================
/**
 * @file	pkthln_svdata.h
 * @brief	ポケスロンセーブ関連
 * @author	Nozomu Saito GAME FREAK inc.
 * @date	2008.08.18
 */
//============================================================================================

#ifndef __PKTHLN_SVDATA_H__
#define __PKTHLN_SVDATA_H__

#include "savedata/savedata_def.h"	//SAVEDATA参照のため
#include "system/buflen.h"

#define PKTHLN_EVT_MAX	(10)	//ポケスロン競技数

#define ALONE_EVT_MAX	(3)		//一人用ポケスロン競技回数
#define COMM_EVT_MAX	(4)		//通信用ポケスロン競技回数
#define ALONE_COURSE_NUM	(5)	//一人用コース数
#define COMM_COURSE_NUM		(5)	//通信用コース数

#define POKE_ENTRY_MAX		(3)		//ポケスロン参加ポケモン数
#define BEST_FIVE		(5)		//ベストファイブ

#define MEDAL_TYPE_MAX	(5)		//メダル種類数（コースの数と同じ）

#define MEDAL_SPD_BIT	(1)
#define MEDAL_POW_BIT	(2)
#define MEDAL_TEQ_BIT	(4)
#define MEDAL_STA_BIT	(8)
#define MEDAL_JMP_BIT	(16)

#define MEDAL_ALL_BIT_MASK	(0x1f)

//レコードが無いときの値
#define REC_NO_DATA		(0xffff)


//最大値定義
#define PLAY_TIME_MAX		(59999)		//プレイ時間最大値　分
#define THLN_POINT_MAX		(99999)		//買い物ポイント最大値

#define ENTRY_NUM_MAX	(9999999)	//参加回数最大値

#define BOUNUS_MAX	(9999999)	//ボーナス取得回数最大値
#define TOUCH_MAX	(9999999)	//画面タッチ回数最大値
#define FAIL_MAX	(9999999)	//失敗回数最大値
#define JUMP_MAX	(9999999)	//ジャンプ回数最大値
#define GET_MAX		(9999999)	//得点取得回数最大値
#define ATTACK_MAX	(9999999)	//体当たり回数最大値
#define FALL_MAX	(9999999)	//落下回数最大値
#define DASH_MAX	(9999999)	//ダッシュ回数最大値
#define CHG_MAX		(9999999)	//交代回数最大値
#define OWN_MAX		(9999999)	//自滅回数最大値

#define ALONE_PLAY_MAX	(9999999)	//非通信回数最大値
#define ALONE_WIN_MAX	(9999999)	//非通信優勝回数最大値
#define ALONE_LOSE_MAX	(9999999)	//非通信最下位回数最大値

#define COMM_PLAY_MAX	(9999999)	//通信回数最大値
#define COMM_WIN_MAX	(9999999)	//通信優勝回数最大値
#define COMM_LOSE_MAX	(9999999)	//通信最下位回数最大値

#define EVT_WIN_MAX		(9999999)	//競技一位回数最大値
#define EVT_LOSE_MAX	(9999999)	//競技最下位回数最大値
#define FUN_MAX			(65535)	//ファン数最大値

#define PKTHLN_SCORE_MAX	(999)		//スコア関連最大値

#define PKTHLN_DATA_CARD_MAX	( 27 )	// ポケスロンデータカード最大数

typedef enum {
	CRS_ID_SPD,
	CRS_ID_POW,
	CRS_ID_TEQ,
	CRS_ID_STA,
	CRS_ID_JMP,

	CRS_ID_SPD_JMP,
	CRS_ID_JMP_TEQ,
	CRS_ID_TEQ_POW,
	CRS_ID_POW_STA,
	CRS_ID_STA_SPD,

	CRS_ID_MAS,	///< マスターコース
	CRS_ID_NUM = 10,	/// マスター以外のコース数
}CRS_ID;

typedef struct PKTHLN_SV_DATA_tag  *PKTHLN_SV_DATA_PTR;

typedef struct MONS_DATA_tag
{
	u32 MonsNo:9;
	u32 Form:5;
	u32 Sex:2;
	u32 Rare:1;
	u32 dummy:15;		//4
	u32 Rnd;			//4
	u32 TrID;			//4
}MONS_DATA;	//計12バイト

//一人用１コース分セーブデータ
typedef struct PKTH_COURSE_tag
{
	//競技得点
	u16 EvtScore[ALONE_EVT_MAX];	//2x3 = 6
	//最高得点
	u16 MaxScore;					//2
	//ポケモン情報
	MONS_DATA	MonsData[POKE_ENTRY_MAX];	//12x3 = 36
}PKTH_COURSE;									//計44byte

typedef struct PKTH_EVT_RCMS_tag
{
	//記録
	u16 Record;						//2
	//フォルムとポケモンナンバー
	u16 FrmMnsNo[POKE_ENTRY_MAX];		//2x3 = 6		下位10ビットをモンスターナンバー、上位6ビットをフォルムに使用する
}PKTH_EVT_RCMS;				//計8byte

//競技データ(一人用・通信用共有)
typedef struct PKTH_EVT_DATA_tag
{
	PKTH_EVT_RCMS RcMs[BEST_FIVE];	//8x5 = 40
	//参加回数
	u32 EntryNum;						//4
}PKTH_EVT_DATA;						//計44byte

//通信用トレーナーデータ
typedef struct PKTH_TR_DATA_tag
{
	//トレーナーＩＤ
	u32 TrID;			//4
	//トレーナー名
	u16 TrName[BUFLEN_PERSON_NAME];		//2x8 = 16
	//国コード
	u8 CountryCode;		//1
	//ダミー
	u8 dummy[3];		//3
}PKTH_TR_DATA;					//計24byte

//通信用競技データ
typedef struct PKTH_COMM_EVT_DATA_tag
{
	PKTH_EVT_DATA EvtData;			//44
	PKTH_TR_DATA	TrData[BEST_FIVE];	//24x5 = 120
}PKTH_COMM_EVT_DATA;					//計164byte

//ランキングデータ
typedef struct PKTH_RNK_DATA_tag
{
	u32 PlayMinute;		//プレイ時間(分)
	u32 AlonePlay;		//非通信プレイ回数
	u32 AloneWin;		//非通信優勝回数
	u32 AloneLose;		//非通信最下位回数
	u32 BonusNum;		//ボーナス取得回数
	u32 TouchNum;		//タッチ回数
	//4x6
	u32 PokeFail;		//ポケモン失敗回数
	u32 PokeJump;		//ポケモンジャンプ回数
	u32 PointGet;		//得点取得回数
	u32 PokeAttack;		//ポケモン体当たり回数
	u32 PokeFall;		//ポケモン落下回数
	u32 PokeDash;		//ポケモンダッシュ回数
	u32 PokeChange;		//ポケモン交代回数
	u32 OwnGoal;		//自殺点回数
	//4x8
	u32 CommPlay;		//通信プレイ回数
	u32 CommWin;		//通信優勝回数
	u32 CommLose;		//通信最下位回数
	u32 EvtWinNum[PKTHLN_EVT_MAX];	//競技優勝回数（競技毎別管理）
	u32 EvtLoseNum;					//競技最下位回数（競技間で共通）
	u32 FunNum;			//ファンの数
	//4x15

}PKTH_RNK_DATA;		//計4x29=116byte

//優勝ポケモンデータ
typedef struct PKTH_WIN_POKE_tag
{
	u16 MonsNo;
	u8 Sex;
	u8 Form;
}PKTH_WIN_POKE;		//4byte

extern int PkthlnSv_GetWorkSize(void);
extern void PkthlnSv_Init(void *sv);
extern PKTHLN_SV_DATA_PTR	PkthlnSv_GetSaveData(SAVEDATA * sv);

extern const PKTH_COURSE *PkthlnSv_GetCrsDataAloneCnst(PKTHLN_SV_DATA_PTR ptr);
extern const u8 *PkthlnSv_GetMedalDataCnst(PKTHLN_SV_DATA_PTR ptr);
extern const PKTH_EVT_DATA *PkthlnSv_GetEvtDataAloneCnst(PKTHLN_SV_DATA_PTR ptr);
extern const PKTH_COMM_EVT_DATA *PkthlnSv_GetEvtDataCommCnst(PKTHLN_SV_DATA_PTR ptr);
extern u16 *PkthlnSv_GetBestRecScore(PKTHLN_SV_DATA_PTR ptr);
extern const PKTH_RNK_DATA *PkthlnSv_GetRnkDataCnst(PKTHLN_SV_DATA_PTR ptr);

extern PKTH_COURSE *PkthlnSv_GetCrsDataAlone(PKTHLN_SV_DATA_PTR ptr);
extern u8 *PkthlnSv_GetMedalData(PKTHLN_SV_DATA_PTR ptr);
extern BOOL PkthlnSv_IsMedal(PKTHLN_SV_DATA_PTR ptr, const CRS_ID inCrsID, const int inMonsNo);

extern PKTH_EVT_DATA *PkthlnSv_GetEvtDataAlone(PKTHLN_SV_DATA_PTR ptr);
extern PKTH_COMM_EVT_DATA *PkthlnSv_GetEvtDataComm(PKTHLN_SV_DATA_PTR ptr);
extern PKTH_RNK_DATA *PkthlnSv_GetRnkData(PKTHLN_SV_DATA_PTR ptr);

extern void PkthlnSv_SetCrsDataAlone(	PKTHLN_SV_DATA_PTR ptr,
										const CRS_ID inCrsID,
										const PKTH_COURSE *inCrsData	);
extern void PkthlnSv_SetMedalData(PKTHLN_SV_DATA_PTR ptr, const CRS_ID inCrsID, const int inMonsNo);
extern void PkthlnSv_SetMedalDataByBit(PKTHLN_SV_DATA_PTR ptr, const u8 inMask, const int inMonsNo);
extern const u8 PkthlnSv_GetPokeMedalData(PKTHLN_SV_DATA_PTR ptr, const int inMonsNo);
extern void PkthlnSv_SetEvtDataAlone(	PKTHLN_SV_DATA_PTR ptr, const int inEvtID,
										const PKTH_EVT_DATA *inEvtData );
extern void PkthlnSv_SetEvtDataComm(	PKTHLN_SV_DATA_PTR ptr, const int inEvtID,
										const PKTH_COMM_EVT_DATA *inEvtData );
extern void PkthlnSv_AddThlnPoint( PKTHLN_SV_DATA_PTR ptr, const u16 inVal );
extern void PkthlnSv_SubThlnPoint( PKTHLN_SV_DATA_PTR ptr, const u16 inVal );
extern u32 PkthlnSv_GetThlnPoint( PKTHLN_SV_DATA_PTR ptr );


extern  int PkthlnSv_GetRankingAppear ( PKTHLN_SV_DATA_PTR ptr, int index );
extern void PkthlnSv_SetRankingAppear ( PKTHLN_SV_DATA_PTR ptr, int index );
extern void PkthlnSv_ResetRankingAppear ( PKTHLN_SV_DATA_PTR ptr, int index );
extern  int PkthlnSv_GetShopFlag ( PKTHLN_SV_DATA_PTR ptr, int index );
extern void PkthlnSv_SetShopFlag ( PKTHLN_SV_DATA_PTR ptr, int index );
extern void PkthlnSv_ClearShopFlag ( PKTHLN_SV_DATA_PTR ptr );

extern int PkthlnWPokeSv_GetWorkSize(void);
extern void PkthlnWPokeSv_Init(void *sv);
extern PKTH_WIN_POKE* PkthlnWPokeSv_GetSaveData(SAVEDATA * sv);


#endif	//__PKTHLN_SVDATA_H__
